package com.woniuxy.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.apache.catalina.core.ApplicationContext;
import org.springframework.beans.factory.BeanFactory;

import java.util.Date;

/**
 * 在项目中jwt的定义
 */
public class JWTUtil {
    /**
     * 过期时间 5min过期  我们引入redis以后，就不用这里来配置过期时间！
     */
//    private static final long EXPIRE_TIME=5*60*1000;
    /**
     * @todo  这个验证方法是再生成一次秘钥，自动比较 当前token是不是之前生成的token
     * @param token  认证的JWT   传入token，通过账号密码重新生成token和我们传入的token进行认证
     *               目前我们 有了redis以后，还需要重新生成jwt来进行认证么？
     * @param username 账号
     * @param secrit 密码 动态签名
     * @return
     */
    @Deprecated
    public static boolean verify(String token,String username,String secrit){
        //这里需要加密算法来对我们的密码进行加密
        Algorithm algorithm = Algorithm.HMAC256(secrit);
        //重新生成一个token
        JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username)
                .build();
        //比较两个token的内容
        verifier.verify(token);
        return true;
    }

    /**
     * 签名生成jwt
     * @param username
     * @param secrit 当做密码
     * @return token
     */
    public static String sign(String username,String secrit){
        //过期时间 取消 将由redis进行过期判断
//        Date exprietime = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        //对唯一秘钥进行加密使用
        Algorithm algorithm = Algorithm.HMAC256(secrit);
        return JWT.create()
                .withClaim("username",username)
                .sign(algorithm);
    }

    /**
     * 用来传入token返回一个该token的用户名
     * @param token
     * @return
     */
    public static String getUserName(String token){
        DecodedJWT jwt = JWT.decode(token);
        Claim username = jwt.getClaim("username");
        return username.asString();
    }
}
